স্প্রিং সিকিউরিটিতে রোল এবং গ্রান্টড অথরিটির মধ্যে পার্থক্য


227

স্প্রিং সিকিউরিটিতে ধারণাগুলি এবং বাস্তবায়ন রয়েছে যেমন GrantedAuthorityইন্টারফেসের মাধ্যমে কোনও অ্যাক্সেস অনুমোদিত / নিয়ন্ত্রণ করার জন্য কোনও কর্তৃপক্ষ পেতে পারে।

আমি এটিকে অনুমোদনযোগ্য ক্রিয়াকলাপগুলিতে, যেমন ক্রিয়েটসউবার্স বা মুছে ফেলা অ্যাকাউন্টগুলি , যা আমি কোনও প্রশাসকের (ভূমিকা সহ ROLE_ADMIN) অনুমতি দেব ।

আমি অনলাইনে যে টিউটোরিয়াল / ডেমো দেখি তা হিসাবে বিভ্রান্ত হয়ে পড়ছি। আমি যা পড়ি তা সংযোগ দেওয়ার চেষ্টা করি, তবে আমি মনে করি আমরা দু'জনকে বিনিময়যোগ্য আচরণ করি।

আমি hasRoleএকটি GrantedAuthorityস্ট্রিং গ্রাস দেখতে পাচ্ছি ? আমি অবশ্যই এটি বোঝার জন্য ভুল করছি। স্প্রিং সিকিউরিটিতে এগুলি ধারণাগতভাবে কী কী?

আমি কীভাবে কোনও ব্যবহারকারীর ভূমিকা সঞ্চয় করব, সেই ভূমিকার জন্য কর্তৃপক্ষ থেকে আলাদা?

আমি সেই org.springframework.security.core.userdetails.UserDetailsইন্টারফেসটিও দেখছি যা প্রমাণীকরণ-সরবরাহকারী রেফারেন্সড ডিএও-তে ব্যবহৃত হয়, যা একটি Userগ্রাহক (সর্বশেষ গ্রান্টডঅুরিটিটি নোট করুন):

public User(String username, 
            String password, 
            boolean enabled, 
            boolean accountNonExpired,
            boolean credentialsNonExpired, 
            boolean accountNonLocked, 
            Collection<? extends GrantedAuthority> authorities)

বা অন্য দুটি পার্থক্য করার কোন উপায় আছে? না এটি সমর্থিত এবং আমাদের নিজের তৈরি করতে হবে?

উত্তর:


365

একটি অনুমোদিত অনুমতি বা "অধিকার" হিসাবে গ্র্যান্টডঅর্থারিটি হিসাবে ভাবেন। সেই "অনুমতিগুলি" (সাধারণত) স্ট্রিং হিসাবে প্রকাশ করা হয় ( getAuthority()পদ্ধতি সহ)। এই স্ট্রিংগুলি আপনাকে অনুমতিগুলি সনাক্ত করতে দেয় এবং আপনার ভোটারদের কোনও কিছুর অ্যাক্সেস দেয় কিনা তা সিদ্ধান্ত নিতে দেয়।

আপনি ব্যবহারকারীদের সুরক্ষা প্রসঙ্গে রেখে বিভিন্ন মঞ্জুরিপ্রাপ্ত অনুমোদন (অনুমতি) দিতে পারেন। আপনি সাধারণত নিজের ইউজারডেটেলস সার্ভিস প্রয়োগ করে একটি ইউজারডেটেল বাস্তবায়ন ফিরিয়ে দেন যা প্রয়োজনীয় গ্রান্টড অথরিটিজগুলি প্রদান করে।

ভূমিকা (যেমন তারা অনেক উদাহরণে ব্যবহৃত হয়) নামকরণের কনভেনশনের সাথে কেবল "অনুমতি" থাকে যা বলে যে একটি ভূমিকা একটি গ্রান্টডঅর্টিটি হয় যা উপসর্গ দিয়ে শুরু হয় ROLE_। এর চেয়ে বেশি কিছুই নেই। একটি ভূমিকা কেবল একটি অনুমোদিত অনুমতি - একটি "অনুমতি" - একটি "অধিকার"। আপনি বসন্ত সুরক্ষার অনেক জায়গাগুলি দেখতে পান যেখানে এর ROLE_উপসর্গের ভূমিকাটি বিশেষত উদাহরণস্বরূপ রোলভোটারে পরিচালিত হয়, যেখানে ROLE_উপসর্গটি ডিফল্ট হিসাবে ব্যবহৃত হয়। এটি আপনাকে ROLE_উপসর্গের বাইরেও ভূমিকাটির নাম সরবরাহ করতে দেয় । স্প্রিং সিকিউরিটি 4 এর আগে, "ভূমিকা" এর এই বিশেষ পরিচালনাটি খুব ধারাবাহিকভাবে অনুসরণ করা হয়নি এবং কর্তৃপক্ষ এবং ভূমিকাগুলি প্রায়শই একইরকম আচরণ করা হয় (যেমন আপনি যেমনhasAuthority()hasRole())। স্প্রিং সিকিউরিটি 4 এর সাথে, ভূমিকার চিকিত্সা আরও সুসংগত এবং কোড যা "রোল" এর সাথে সম্পর্কিত (যেমন RoleVoter, hasRoleএক্সপ্রেশন ইত্যাদি) সর্বদা ROLE_আপনার জন্য উপসর্গ যুক্ত করে । সুতরাং এর hasAuthority('ROLE_ADMIN')অর্থ একই hasRole('ADMIN')কারণ ROLE_উপসর্গটি স্বয়ংক্রিয়ভাবে যুক্ত হয়ে যায়। আরও তথ্যের জন্য বসন্ত সুরক্ষা 3 থেকে 4 মাইগ্রেশন গাইড দেখুন

তবে তবুও: একটি ভূমিকা কেবল একটি বিশেষ ROLE_উপসর্গ সহ একটি কর্তৃপক্ষ । স্প্রিং নিরাপত্তা 3 তাই @PreAuthorize("hasRole('ROLE_XYZ')")একই হিসাবে @PreAuthorize("hasAuthority('ROLE_XYZ')")এবং বসন্ত নিরাপত্তা 4 @PreAuthorize("hasRole('XYZ')")হিসাবে একই @PreAuthorize("hasAuthority('ROLE_XYZ')")

আপনার ব্যবহারের ক্ষেত্রে:

ব্যবহারকারীদের ভূমিকা আছে এবং ভূমিকা কিছু নির্দিষ্ট ক্রিয়াকলাপ সম্পাদন করতে পারে।

GrantedAuthoritiesকোনও ব্যবহারকারীর ভূমিকা এবং অপারেশনগুলি কোনও ভূমিকা পালন করতে পারে তার জন্য আপনি শেষ করতে পারেন। GrantedAuthoritiesভূমিকা প্রিফিক্স আছে ROLE_এবং অপারেশন উপসর্গ আছে OP_। একটি উদাহরণ অপারেশন কর্তৃপক্ষ হতে পারে জন্য OP_DELETE_ACCOUNT, OP_CREATE_USER, OP_RUN_BATCH_JOBইত্যাদি ভূমিকা হতে পারে ROLE_ADMIN, ROLE_USER, ROLE_OWNERইত্যাদি

আপনি আপনার সত্তাগুলি GrantedAuthorityএই (সিউডো কোড) উদাহরণের মতো প্রয়োগ করতে পারেন:

@Entity
class Role implements GrantedAuthority {
    @Id
    private String id;

    @ManyToMany
    private final List<Operation> allowedOperations = new ArrayList<>();

    @Override
    public String getAuthority() {
        return id;
    }

    public Collection<GrantedAuthority> getAllowedOperations() {
        return allowedOperations;
    }
}

@Entity
class User {
    @Id
    private String id;

    @ManyToMany
    private final List<Role> roles = new ArrayList<>();

    public Collection<Role> getRoles() {
        return roles;
    }
}

@Entity
class Operation implements GrantedAuthority {
    @Id
    private String id;

    @Override
    public String getAuthority() {
        return id;
    }
}

ভূমিকা ও অপারেশনের আইডি আপনি আপনার ডাটাবেসের মধ্যে তৈরি GrantedAuthority উপস্থাপনা, যেমন হবে ROLE_ADMIN, OP_DELETE_ACCOUNTইত্যাদি যখন একজন ব্যবহারকারী অনুমোদন যাচাই করা হয়, নিশ্চিত করুন যে সব তার ভূমিকা সব GrantedAuthorities এবং সংশ্লিষ্ট অপারেশন UserDetails.getAuthorities থেকে প্রত্যাগত হয় তা নিশ্চিত () পদ্ধতি।

উদাহরণ: আইডি সহ প্রশাসকের ভূমিকা ROLE_ADMINঅপারেশন হয়েছে OP_DELETE_ACCOUNT, OP_READ_ACCOUNT, OP_RUN_BATCH_JOBএটি নির্ধারিত হয়। আইডি সহ ব্যবহারকারীর ভূমিকাটির ROLE_USERঅপারেশন রয়েছে OP_READ_ACCOUNT

ফলে নিরাপত্তা প্রেক্ষাপটে একজন প্রশাসক লগ GrantedAuthorities থাকবে এমন: ROLE_ADMIN, OP_DELETE_ACCOUNT, OP_READ_ACCOUNT,OP_RUN_BATCH_JOB

কোনো ইউজারের লগ তাহলে এটি হবে: ROLE_USER,OP_READ_ACCOUNT

ইউজারডেটেলস সার্ভিস সেই সমস্ত ভূমিকা এবং সমস্ত ক্রিয়াকলাপ সংগ্রহ এবং ফিরিয়ে নেওয়া ইউজার-ডেটা দের উদাহরণে getAuthorities () পদ্ধতি দ্বারা তাদের উপলব্ধ করার জন্য যত্ন নেবে।


2
ধন্যবাদ! "হ্যাজরল ('রোলেনাম'))" স্প্রিং 4 এ কেন কাজ করছে না তার জন্য আমি সর্বত্র অনুসন্ধান করছি -> তাদের ডকুমেন্টেশনগুলি এড়াতে খুব দ্রুত ছিল না। কেবলমাত্র একটি "অনুসন্ধান এবং প্রতিস্থাপন" দ্রুত এবং আমি আবার ট্র্যাক এ ফিরে আসছি!
জার্জেন স্কার ফিশার

12
এটি একটি দুর্দান্ত উত্তর। একটি বিষয়টিকে একটু আলাদাভাবে ব্যাখ্যা করার জন্য স্পষ্ট করে জানাতে, hasRole('xyz')স্প্রিং সিকিউরিটি 4 আপনার কাছে আরএলএল_ উপসর্গের hasAuthority('xyz')প্রত্যাশা করে যেখানে প্রিফিক্সটি প্রত্যাশা করে না এবং কী পাস হয়েছে তা মূল্যায়ন করে না আমি এই সমাধানটি ব্যবহার করেছি, তবে hasRole('OP_MY_PERMISSION')যেহেতু সমস্যাগুলির মধ্যে দিয়ে চলেছি ROLE_ উপসর্গ প্রয়োজন পড়তো। পরিবর্তে, আমার hasAuthority('OP_MY_PERMISSION')যেহেতু আমার উপসর্গটি ছিল না তা ব্যবহার করা উচিত ছিল ।
র্যান্ডাল 4

@james আপনি যদি এই প্রশ্নের তাকান পারেন stackoverflow.com/questions/41500031/...
সৌরভ কুমার

1
জেএসটিএল স্প্রিংফ্রেমওয়ার্ক.আর / সুরক্ষা / ট্যাগগুলি <sec:authorize access="hasRole('ADMIN')">একই হিসাবে রয়েছে<sec:authorize access="hasRole('ROLE_ADMIN')">
আলেক্স78191

1
হ্যাঁ. ওপি_এল একটি স্বেচ্ছাসেবী উপসর্গ। কিছু বসন্ত বাস্তবায়নে ROLE_ এর বিশেষ অর্থ রয়েছে।
জেমস

9

আফাইক গ্রান্টড অথারিটি এবং ভোলগুলি বসন্তের সুরক্ষায় একই। মঞ্জুরিপ্রাপ্ত কর্তৃপক্ষের getAuthority () স্ট্রিংয়ের ভূমিকা (ডিফল্ট বাস্তবায়ন সিম্পলগ্র্যান্টঅর্টিভিটি অনুযায়ী) is

আপনার ক্ষেত্রে হতে পারে আপনি শ্রেণিবদ্ধ ভূমিকা ব্যবহার করতে পারেন

<bean id="roleVoter" class="org.springframework.security.access.vote.RoleHierarchyVoter">
    <constructor-arg ref="roleHierarchy" />
</bean>
<bean id="roleHierarchy"
        class="org.springframework.security.access.hierarchicalroles.RoleHierarchyImpl">
    <property name="hierarchy">
        <value>
            ROLE_ADMIN > ROLE_createSubUsers
            ROLE_ADMIN > ROLE_deleteAccounts 
            ROLE_USER > ROLE_viewAccounts
        </value>
    </property>
</bean>

আপনি সন্ধান করছেন এমন সঠিক সমাধান নয়, তবে আশা করি এটি সহায়তা করবে helps

সম্পাদনা করুন : আপনার মন্তব্যে জবাব দিন

ভূমিকাটি বসন্ত-সুরক্ষার অনুমতিের মতো। হ্যাজরলের সাথে ইন্টারসেপ্ট-ইউআরএল ব্যবহার করে কোন ভূমিকা / অনুমোদনের জন্য কোন অপারেশন অনুমোদিত তা একটি খুব সূক্ষ্ম দানাদার নিয়ন্ত্রণ সরবরাহ করে।

আমাদের অ্যাপ্লিকেশনটিতে আমরা যেভাবে পরিচালনা করি তা হ'ল আমরা প্রতিটি ক্রিয়াকলাপের জন্য অনুমতি (অর্থাত্ ভূমিকা) বা সংক্ষিপ্ত বিবরণ, অথবা মুছে ফেলা_একউন্ট, অ্যাড_একাউন্ট ইত্যাদির জন্য সংজ্ঞায়িত করি Then তারপরে আমরা প্রতিটি ব্যবহারকারীর জন্য লজিক্যাল প্রোফাইল তৈরি করি যেমন অ্যাডমিন, গেস্ট_উজার, নরমাল ব্যবহারকারীর জন্য। প্রোফাইলগুলি কেবলমাত্র অনুমতিগুলির যৌক্তিক গোষ্ঠীকরণ, বসন্ত-সুরক্ষা ব্যতীত। যখন কোনও নতুন ব্যবহারকারী যুক্ত করা হয়, তখন একটি প্রোফাইল তাকে বরাদ্দ করা হয় (সমস্ত অনুমোদিত অনুমতি থাকা)। এখন যখনই ব্যবহারকারী কিছু পদক্ষেপ নেওয়ার চেষ্টা করেন, তখন সেই ক্রিয়াকলাপের অনুমতি / ভূমিকা ব্যবহারকারীর অনুমোদিত অনুমোদনের বিরুদ্ধে পরীক্ষা করা হয়।

এছাড়াও ডিফল্ট রোলওয়েটার উপসর্গটি ROLE_ ব্যবহার করে, সুতরাং ROLE_ দিয়ে শুরু হওয়া যে কোনও কর্তৃপক্ষকে ভূমিকা হিসাবে বিবেচনা করা হয়, আপনি ভূমিকা ভোটারের ক্ষেত্রে একটি কাস্টম রোলপ্রফিক্স ব্যবহার করে এবং বসন্ত সুরক্ষায় এটি ব্যবহার করে এই ডিফল্ট আচরণটি পরিবর্তন করতে পারেন।


1
আপনার সাহায্যের জন্য ধন্যবাদ। হায়ারার্কি অন্য কিছু বলে মনে হচ্ছে। আমি এখন যেভাবে এটি করার কথা ভাবছি (যদি আমাকে স্প্রিং সিকিউরিটি ব্যবহার করতে হয়) তবে ভূমিকা এবং কর্তৃত্ব উভয়কেই একই তালিকায় রাখে এবং উভয়ের জন্য চেক সঞ্চালনের জন্য হ্যাশরোল প্রিকিকেট ব্যবহার করে। এ সম্পর্কে আরও চিন্তা করা- এটি সম্ভবত স্প্রিং সিকিউরিটির লোকেরা ইচ্ছাকৃত রেখে দিয়েছে? ভূমিকা বা অধিকার / অধিকার / কর্তৃপক্ষের সম্পূর্ণ তালিকায় hasRol ব্যবহার করে বা অন্য অনুমোদনের অ্যাপ্লিকেশনগুলির মধ্যে চেক ব্যতীত ইন্টারসেপ্ট-ইউআরএল ব্যবহার করার কোনও সম্ভাবনা আছে কি? এছাড়াও, আরএলএলিকে উপসর্গ করার কী দরকার? এটা কি কনভেনশন?
চিন্মায়

7

এই ধারণাগুলির মধ্যে সম্পর্ক বোঝার আরেকটি উপায় হ'ল কর্তৃপক্ষের ধারক হিসাবে কোনও আরএলএলকে ব্যাখ্যা করা।

কর্তৃপক্ষগুলি কখনও কখনও নির্দিষ্ট ডেটা স্কোপ বা প্রসঙ্গের সাথে মিলিত কোনও নির্দিষ্ট ক্রিয়াকে লক্ষ্যবস্তু করে সূক্ষ্ম অনুমতিযুক্ত হয়। উদাহরণস্বরূপ, পড়ুন, লিখুন, পরিচালনা করুন, তথ্যের একটি নির্দিষ্ট সুযোগে বিভিন্ন স্তরের অনুমতিগুলি উপস্থাপন করতে পারে।

এছাড়াও, কর্তৃপক্ষগুলি একটি অনুরোধের প্রক্রিয়াকরণ প্রবাহের গভীরে প্রয়োগ করা হয় যখন আরএলএল নিয়ন্ত্রণকারীর কাছে পৌঁছানোর আগে অনুরোধ ফিল্টারের মাধ্যমে ফিল্টার করা হয়। সেরা অনুশীলনগুলি ব্যবসায়ের স্তরে নিয়ন্ত্রকের অতীতে কর্তৃপক্ষের প্রয়োগ বাস্তবায়নকে নির্দেশ করে।

অন্যদিকে, আরএলএলএস হ'ল অনুমতিগুলির সেটগুলির মোটা দানাদার প্রতিনিধিত্ব। একটি আরএলএএলএডিএডিআরারের কেবল পঠন বা দেখার কর্তৃত্ব থাকবে যখন কোনও ROLE_EDITOR পড়তে এবং লিখতে পারে। ভূমিকাগুলি মূলত অনুরোধ প্রক্রিয়াকরণের বাইরের দিকে যেমন HTTP তে প্রথম স্ক্রিনিংয়ের জন্য ব্যবহৃত হয়। ... .্যান্টম্যাচার (...) .রোল (রোলে_ম্যানেজার)

অনুরোধের প্রক্রিয়া প্রবাহের গভীরতায় কর্তৃপক্ষ প্রয়োগ করা হচ্ছে অনুমতিটির একটি সূক্ষ্ম দানযুক্ত প্রয়োগের অনুমতি দেয়। উদাহরণস্বরূপ, কোনও ব্যবহারকারীর কাছে প্রথম পর্যায়ে কোনও সংস্থান পড়ার জন্য পড়ার অনুমতি থাকতে পারে তবে কেবলমাত্র একটি সাব-রিসোর্সে পড়ুন to কোনও ROLE_READER থাকলে প্রথম স্তরের রিসোর্স সম্পাদনা করার তার অধিকারকে বাধা দেওয়া হবে কারণ এই সংস্থানটি সম্পাদনা করার জন্য তাকে লেখার অনুমতি প্রয়োজন তবে @PreAuthorize ইন্টারসেপ্টার সাব-রিসোর্সটি সম্পাদনা করতে তার অস্থায়ীটিকে অবরুদ্ধ করতে পারে।

জেক


2

অন্যরা যেমন উল্লেখ করেছে, আমি আরও দানাদার অনুমতিগুলির জন্য ধারক হিসাবে ভূমিকা মনে করি।

যদিও আমি হায়ারার্কির ভূমিকা বাস্তবায়নের ক্ষেত্রে এই দানাদার অনুমতিটির সূক্ষ্ম নিয়ন্ত্রণের অভাব পেয়েছি।
তাই আমি সম্পর্কগুলি পরিচালনা করতে এবং সুরক্ষা প্রসঙ্গে মঞ্জুরিপ্রাপ্ত কর্তৃপক্ষ হিসাবে অনুমতিগুলি ইনজেকশনের জন্য একটি গ্রন্থাগার তৈরি করেছি।

অ্যাপটিতে আমার কাছে কিছু সেট অনুমতি থাকতে পারে, যা ক্রিয়েট, রিড, আপডেট, ডিলেট, এর পরে ব্যবহারকারীর ভূমিকার সাথে সম্পর্কিত something

বা আরও নির্দিষ্ট অনুমতি যেমন READ_POST, READ_PUBLISHED_POST, CREATE_POST, PUBLISH_POST

এই অনুমতিগুলি তুলনামূলকভাবে স্থিতিশীল, তবে তাদের সাথে ভূমিকার সম্পর্ক গতিশীল হতে পারে।

উদাহরণ -

@Autowired 
RolePermissionsRepository repository;

public void setup(){
  String roleName = "ROLE_ADMIN";
  List<String> permissions = new ArrayList<String>();
  permissions.add("CREATE");
  permissions.add("READ");
  permissions.add("UPDATE");
  permissions.add("DELETE");
  repository.save(new RolePermissions(roleName, permissions));
}

কোনও ভূমিকার সাথে এই অনুমতিগুলির সম্পর্ক পরিচালনা করতে আপনি API তৈরি করতে পারেন।

আমি অন্য উত্তরটি অনুলিপি / আটকে দিতে চাই না, সুতরাং এসও-তে আরও সম্পূর্ণ ব্যাখ্যার লিঙ্কটি এখানে।
https://stackoverflow.com/a/60251931/1308685

আমার প্রয়োগটি পুনরায় ব্যবহার করতে, আমি একটি রেপো তৈরি করেছি। অবদান নির্দ্বিধায় দয়া করে!
https://github.com/savantly-net/spring-role-permissions

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.