Files
2025-08-16 14:53:13 +03:00

79 lines
3.2 KiB
Plaintext

<!---
Access check aka проверка доступа.
Если доступа нет, код, заключенный внутри тега, не выполняется, текст не выводится.
Два варианта использования.
1. При заданном значении действия проверяется наличие этого доступа к объекту, ответ да-нет
2. Проверяется уровень доступа к заданному объекту
Для пустого объекта
Если задать строковый атрибут output, в переменную с таким именем запишется
TRUE(доступ разрешен)/FALSE(доступ запрещен).
Тег обязательно должен быть закрыт.
---><cfsilent>
<!--- проверка на закрытость тега - без закрытия возможна неоднозначность со вложенными тегами --->
<cfif NOT thisTag.hasEndTag>
<cfthrow
type="custom" message="Unclosed AC.CFM tag found."
detail="AC.CFM tag must be closed. Self-closed tag is acceptable, e.g.: &lt;cfmodule template=""mod/ac.cfm"" /&gt;.">
</cfif>
<cfif thisTag.ExecutionMode is 'start'>
<cfparam name="ATTRIBUTES.obj" type="string" default=""/><!---
объект, к которому проверяется доступ --->
<cfparam name="ATTRIBUTES.act" type="numeric" default="#request.PERMISSION_READ#"/><!---
действие, которое проверяется --->
<cfparam name="ATTRIBUTES.output" type="string" default=""/>
<cfparam name="ATTRIBUTES.permissionOut" type="string" default=""/>
<cfset permission=request.PERMISSION_NONE/>
<cfif ATTRIBUTES.obj EQ "">
<cfif #request.usrAuthenticated()#>
<cfset permission=request.PERMISSION_WRITE/>
<cfelse>
<cfset permission=request.PERMISSION_READ/>
</cfif>
<cfset permitted=(ATTRIBUTES.act EQ #request.PERMISSION_READ# OR #request.usrAuthenticated()#)/>
<cfelse>
<cftry>
<cfset permitted=(len(ATTRIBUTES.obj) GT 0)>
<!---*** Максимальный доступ для перечисленных объектов и ролей
Можно подумать о минимальном--->
<cfquery name="qACL" datasource="#request.DS#">
select coalesce(max(permission),0) as permission
from usr_role ur
join acl on acl.role_id=ur.role_id
where ur.usr_id=<cfqueryparam cfsqltype="cf_sql_integer" value="#request.usr_id#">
and acl.obj in (<cfqueryparam cfsqltype="cf_sql_varchar" value="#ATTRIBUTES.obj#" list="true">)
</cfquery>
<cfset permitted=(qACL.permission GE ATTRIBUTES.act)>
<cfset permission=#qACL.permission#/>
<cfcatch type="database">
<cfset permitted="Yes"/><!---***--->
<cfrethrow/>
</cfcatch>
</cftry>
</cfif>
<cfif len(ATTRIBUTES.output)>
<cfset setVariable("CALLER.#ATTRIBUTES.output#", permitted)><!---boolean--->
</cfif>
<cfif len(ATTRIBUTES.permissionOut)>
<cfset setVariable("CALLER.#ATTRIBUTES.permissionOut#", permission)><!---integer 0 1 2--->
</cfif>
<cfif NOT permitted><cfexit method="EXITTAG"></cfif>
</cfif><!---thisTag.ExecutionMode is 'start'--->
</cfsilent>